<?php

/**
 * @Description    用于用户登录后的基类,框架模型基类控制器, 需要登录后才能访问的接口需要继承此类
 * @Author         zhaojiping
 * @Copyright      山东艾思网络科技有限公司(https://www.aisisofit.cn)
 * @Date           2022/1/20
 * @CreateBy       VS Code
 */

namespace app\common\controller;

use think\facade\Db;
use think\facade\Request;

/**
 * 登录验证类
 */
trait AuthTrait {

    public $user     = null;  // 存放登录用户的基础信息, 子类中只需要访问, 不要修改

    /**
     * 初始方法
     * 通过token验证用户, 获取用户信息(赋于全局变量, 如UID, ROLE_ID, $this->user), 验证用户是否有访问权限
     */
    public function initialize() {
        parent::initialize();
        // 验证用户权限
        $this->userAuth();
    }

    // 验证用户是否合法, 如果用户合法定义一些常量供全局使用
    protected function userAuth() {
        //验证登录
        $token = input('token', '');
        if (!$token) {
            json_return('2', '登录令牌失效, 未知原因');
        }

        $user = Db::name('CoreUser')
            ->field('id,username,nickname,role_id,avatar,mobile,usable,department_id')
            ->where(['token' => $token])->find();

        if (!$user)  json_return('2', '登录令牌失效, 请重新登录');

        if ($user['username'] != 'admin')  // 超级管理员不能被禁用
            if ($user['usable'] != 1) json_return(0, '当前账号已被管理员禁用');

        // 定义一些常量
        !defined('UID') && define('UID', $user['id']);
        !defined('ROLE_ID') && define('ROLE_ID', $user['role_id']);
        !defined('DEPARTMENT_ID') && define('POSITION_ID', $user['department_id']);
        $this->user = $user;

        // 进一步验证用户权限
        $this->userRoleRule();
    }

    // 验证用户是否有URL的访问权限
    private function userRoleRule() {
        //验证权限开始, 获取访问链接
        $controller = Request::controller();
        $action     = Request::action();
        $url        = strtolower('/' . $controller . '/' . $action);
        // echo $url;

        // 只检测定义的权限, 未定义的权限默认开放
        if (UID != 1) { // 超级管理员不需要验证
            $rule = Db::name('CoreRule')->where("lower(name) like '%$url%'")->column('id');  // 查询菜单的ID
            //p($rule);
            if ($rule) {
                $role = Db::name('CoreRole')->where(['id' => ROLE_ID])->value('rules');  // 用户权限组拥有的菜单权限
                if (!$role) json_return(0, '用户角色有误');

                $ids = explode(',', $role);
                $result = false;
                foreach ($rule as $val) {
                    //echo $val;
                    foreach ($ids as $v) {
                        //echo $val .'=='. $v .'||';
                        if ($val == $v) {
                            $result = true;
                            break;
                        }
                    }
                    if ($result) break;
                }
                if ($result === false) {
                    json_return(0, '没有此权限 ' . $url);
                }
            }
        }
    }
}
